using Microsoft.AspNetCore.Mvc;
using System.Text.Json.Serialization;

namespace MyWebApi.Controllers;

//[Route("[controller]")] 定义路由，这里会使用控制器名称（去掉"Controller"后缀）,默认路由就是WeatherForecast，也就是https://localhost:7062/weatherforecast/ 
//测试发现，weatherforecast不区分大小写，多个斜杠/也没有任何问题。
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    //[HttpGet] 表示这个方法只响应 GET 请求
    //访问地址：https://localhost:7062/weatherforecast
    //Name 属性只是给路由一个名称，并不会影响实际的 URL 路径。及时不写Namey也可以。
    [HttpGet(Name = "GetWeatherForecast")]
    //[HttpPost()]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }

    //[HttpPost] 表示这个方法只响应 POST 请求
    //访问地址：https://localhost:7062/weatherforecast/2
    [HttpPost("2", Name = "GetWeatherForecast2")]
    //[HttpPost("2")]
    public IEnumerable<WeatherForecast> Get2()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }

    //访问地址：https://localhost:7062/weatherforecast/route-info
    [HttpGet("route-info")]
    public IActionResult GetRouteInfo()
    {
        // 使用路由名称生成URL
        var forecastUrl = Url.Link("GetWeatherForecast", null);
        var forecast2Url = Url.Link("GetWeatherForecast2", null);

        // 使用匿名对象，匿名对象，属性字段可以随意添加。
        var anonymousResult = new
        {
            ForecastUrl = forecastUrl,
            Forecast2Url = forecast2Url,
            Message = "这些URL是通过路由名称生成的",
            MyData = "自己定义的字段"
        };

        // 使用强类型对象
        var typedResult = new RouteInfoResponse
        {
            ForecastUrl = forecastUrl,
            Forecast2Url = forecast2Url,
            Message = "这些URL是通过路由名称生成的",
            MyData = "自己定义的字段"
        };

        return Ok(new
        {
            AnonymousResult = anonymousResult,
            TypedResult = typedResult 
        });
    }

}

// ASP.NET Core 默认使用 camelCase（驼峰命名法）作为 JSON 序列化的命名约定。这是为了符合 JavaScript 的命名惯例，因为在 Web 开发中，JSON 数据经常被 JavaScript 代码使用。
//让我解释一下这个行为：
//默认序列化行为：
//C# 属性名：ForecastUrl、Forecast2Url、Message、MyData
//序列化后的 JSON：forecastUrl、forecast2Url、message、myData；即：默认首字母小写。
// 强类型响应类
public class RouteInfoResponse
{
    [JsonPropertyName("ForecastUrl")]  // 保持大写
    public string ForecastUrl { get; set; }

    //[JsonPropertyName("Forecast2Url")]  // 保持大写，屏蔽掉，默认就是首字母小写。
    public string Forecast2Url { get; set; }

    [JsonPropertyName("Message")]  // 保持大写
    public string Message { get; set; }

    [JsonPropertyName("MyData")]  // 保持大写
    public string MyData { get; set; }
}
